textview: Delete selection when preedit starts
authorMatthias Clasen <mclasen@redhat.com>
Thu, 4 Mar 2021 19:55:40 +0000 (14:55 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 4 Mar 2021 20:18:30 +0000 (15:18 -0500)
This prevents confusing misrendering when the preedit text
pushes the selection text out of the rendered selection.

Fixes: #1123
gtk/gtktextview.c

index c3289a0ce816ffe880c4b9651735f74e19ea0e1e..5b8bca680af58c075260b008e72386f3312b1ad9 100644 (file)
@@ -504,8 +504,10 @@ static void     gtk_text_view_commit_handler               (GtkIMContext  *conte
                                                            GtkTextView   *text_view);
 static void     gtk_text_view_commit_text                  (GtkTextView   *text_view,
                                                             const char    *text);
+static void     gtk_text_view_preedit_start_handler        (GtkIMContext  *context,
+                                                            GtkTextView   *text_view);
 static void     gtk_text_view_preedit_changed_handler      (GtkIMContext  *context,
-                                                           GtkTextView   *text_view);
+                                                            GtkTextView   *text_view);
 static gboolean gtk_text_view_retrieve_surrounding_handler (GtkIMContext  *context,
                                                            GtkTextView   *text_view);
 static gboolean gtk_text_view_delete_surrounding_handler   (GtkIMContext  *context,
@@ -1883,6 +1885,8 @@ gtk_text_view_init (GtkTextView *text_view)
 
   g_signal_connect (priv->im_context, "commit",
                     G_CALLBACK (gtk_text_view_commit_handler), text_view);
+  g_signal_connect (priv->im_context, "preedit-start",
+                    G_CALLBACK (gtk_text_view_preedit_start_handler), text_view);
   g_signal_connect (priv->im_context, "preedit-changed",
                    G_CALLBACK (gtk_text_view_preedit_changed_handler), text_view);
   g_signal_connect (priv->im_context, "retrieve-surrounding",
@@ -8212,6 +8216,13 @@ gtk_text_view_commit_text (GtkTextView   *text_view,
                                       gtk_text_buffer_get_insert (get_buffer (text_view)));
 }
 
+static void
+gtk_text_view_preedit_start_handler (GtkIMContext *context,
+                                     GtkTextView  *self)
+{
+  gtk_text_buffer_delete_selection (self->priv->buffer, TRUE, self->priv->editable);
+}
+
 static void
 gtk_text_view_preedit_changed_handler (GtkIMContext *context,
                                       GtkTextView  *text_view)